package net.sunofbeach.blog.controller.portal;

import net.sunofbeach.blog.response.ResponseResult;
import net.sunofbeach.blog.services.IArticleService;
import net.sunofbeach.blog.services.ICategoryService;
import net.sunofbeach.blog.utils.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/portal/article")
public class ArticlePortalApi {

    @Autowired
    private IArticleService articleService;

    /**
     * 获取文章列表
     * 权限，所有用户
     * 状态：必须是已经发布的，指定的有另外一个接口获取，其他的不可以从此接口获取
     * @param page
     * @param size
     * @return
     */
    @GetMapping("/list/{page}/{size}")
    public ResponseResult listArticle(@PathVariable("page") int page, @PathVariable("size") int size) {
        return articleService.listArticles(page,size,null,null, Constants.Article.STATE_PUBLISH);
    }

    @GetMapping("/list/{categoryId}/{page}/{size}")
    public ResponseResult alistArticleByCategoryId(@PathVariable("categoryId") String categoryId,
                                      @PathVariable("page") int page,
                                      @PathVariable("size") int size
                                      ) {
        return articleService.listArticles(page,size,null,categoryId, Constants.Article.STATE_PUBLISH);
    }



    /**
     * 获取文章详情
     * 权限：Renyiyonghu
     *
     * 内容过滤：只允许拿置顶的，或者已经发布的
     * 其他的获取：比如说草稿，以及已经删除的。已经删除的，只能管理员删除
     *
     *
     * @param articleId
     * @return
     */
    @GetMapping("/{articleId}")
    public ResponseResult getArticleDetail(@PathVariable("articleId") String articleId) {
        return articleService.getArticleById(articleId);
    }

    /**
     * 这个接口是做安卓app用的，暂时还是不太好，后需要改
     * TODO：这里要改奥
     * @param articleId
     * @return
     */
    @GetMapping("/app/{articleId}")
    public ResponseResult getArticleDetailForApp(@PathVariable("articleId") String articleId) {
        return articleService.getArticleByIdForApp(articleId);
    }

    /**
     * 通过标签来计算匹配度
     * 标签：有同一个，或者多个（5个以内，包含5个）
     * 从里面随即哪一个标签出来-->每一次获取的推荐文章，不那么雷同，种子一样酒类通了
     * 通过标签去查询类似的文章，所包含此类标签的文章
     * 如果没有相关文章，则从数据中获取最新的文章
     * @param articleId
     * @return
     */
    @GetMapping("/recommend/{articleId}/{size}")
    public ResponseResult getRecommendArticles(@PathVariable("articleId") String articleId,
                                               @PathVariable("size") int size) {
        return articleService.listRecommendArticle(articleId,size);
    }


    @GetMapping("/top")
    public ResponseResult getTopArticles() {
        return articleService.listTopArticles();
    }


    @GetMapping("/list/label/{label}/{page}/{size}")
    public ResponseResult listArticleByLabel(@PathVariable("label") String label,
                                             @PathVariable("page") int page,
                                             @PathVariable("size") int size) {
        return articleService.listArticlesByLabel(page,size,label);
    }

    @GetMapping("/list/CategoryId/{articleCategoryId}/{page}/{size}")
    public ResponseResult listArticleByCategoryId(@PathVariable("articleCategoryId") String articleCategoryId,
                                             @PathVariable("page") int page,
                                             @PathVariable("size") int size) {
        return articleService.listArticlesByCategoryId(page,size,articleCategoryId);
    }



    /**
     * 获取标签云，用户点击标签，就会通过标签获取相应的文章列表
     * 任意用户
     * @param size
     * @return
     */

    @GetMapping("/label/{size}")
    public ResponseResult getLabels(@PathVariable("size") int size) {
        return articleService.listLabels(size);
    }

    @Autowired
    private ICategoryService categoryService;
    @GetMapping("/categories")
    public ResponseResult getCategories() {
        return categoryService.listCategories();
    }




    @GetMapping("/count")
    public ResponseResult getArticleCount() {
        return articleService.getArticleCount();
    }
}
